import logging

# 基本用法
# 配置日志记录
logging.basicConfig(
    level=logging.DEBUG,
    format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logging.debug("这是调试信息")
logging.info("这是信息")
logging.warning("这是警告信息")
logging.error("这是错误信息")
logging.critical("这是严重错误信息")

logging.info("===================================")

# 创建和使用日志记录器
logger = logging.getLogger("my_logger")
logger.setLevel(logging.DEBUG)
logger.debug("这是调试信息")
logger.info("这是信息")

logging.info("===================================")

# 添加处理器
# StreamHandler():控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - 【%(name)s】 - %(levelname)s - %(message)s")
console_handler.setFormatter(formatter)
# logger添加处理器
logger.addHandler(console_handler)
logger.debug("这是调试信息")
# 控制台处理器设置的是可以处理INFO以上级别的日志
# logger由于添加了控制台处理器，日志信息会通过默认处理和新添加的处理器处理，由于新添加的是控制台输出所以在控制台中会输出两次
logger.info("这是信息")

logger.debug("===========================")
# 文件处理器
# 对于文本我们一般会使用utf-8编码
file_handler = logging.FileHandler("app.log",encoding="utf-8")
file_handler.setLevel(logging.ERROR)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.error("这是错误信息")
logger.critical("这是严重错误信息")

logger.info("===========================")
# 日转轮转
from logging.handlers import RotatingFileHandler

# encoding：用来指定文件编码，maxBytes：指定单个日志文件的最大字节数；backupCount：保留备份文件数量
rotating_file_handler = RotatingFileHandler("app.log",encoding="utf-8",maxBytes=2000,backupCount=5)
rotating_file_handler.setFormatter(formatter)
logger.addHandler(rotating_file_handler)
logger.error("这是错误信息")
logger.critical("这是严重错误信息")

logger.info("===========================")
# 基于时间的日志轮转
from logging.handlers import TimedRotatingFileHandler

# when:指定轮转的时间，midnight表示每天午夜，还有其它的一些值；interval：指定时间间隔，比如interval=1，when="MIDNIGHT"，表示每天0点为间隔进行日志轮转
# backupCount：指定保留的日志文件数量
# encoding：指定文件编码
timed_handler = TimedRotatingFileHandler("app.log",encoding="utf-8",when="midnight",interval=1,backupCount=5)
timed_handler.setFormatter(formatter)
logger.addHandler(timed_handler)
logger.error("这是错误信息")
logger.critical("这是严重错误信息")